package com.herench.bs.transfer;

import org.apache.cxf.endpoint.Client;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 获取患者住院详细信息
 *
 * @author liuxiaohui
 * @date 2019/3/26
 */
public class GetPatAllInHosTransfer extends AbstractTransfer {
    public GetPatAllInHosTransfer(String method, Client client, String messageMethod) {
        super(method, client, messageMethod);
    }

    /**
     * 发送：微信前端JSON数据转换为HIS用的XML数据（微信前端==》HIS）
     * @param params
     * @return
     * @throws Exception
     */
    @Override
    public String toInvokeMessage(Map<String, Object> params) throws Exception {
        // 身份证号
        String idNo = (String) params.get("idNo");
        // 患者ID
        String patientId = (String) params.get("patientId");
        // 住院标识
        String visitId = (String) params.get("visitId");
        // 开始日期
        String startDate = (String) params.get("startDate");
        // 结束日期
        String endDate = (String) params.get("endDate");



        // 交易ID：his的方法名
        Document document = getTplDoc(getMethod());

        // 将各个入参数设值（入参==》XML）
        Element dataRow = document.getRootElement().element("CommitData").addElement("Data").addElement("DataRow");
        // 身份证号
        dataRow.addAttribute("ID_NO", idNo);
        // 患者ID
        dataRow.addAttribute("PATIENT_ID", patientId);
        // 住院标识
        dataRow.addAttribute("VISIT_ID", visitId);
        // 开始日期
        dataRow.addAttribute("START_DATE", startDate);
        // 结束日期
        dataRow.addAttribute("END_DATE", endDate);


        return document.asXML();
    }

    /**
     * 接收：HIS返回的XML数据并转换为JSON（HIS==》微信前端）
     * @param resMsg
     * @return
     * @throws Exception
     */
    @Override
    public Map<String, Object> toResultMessage(String resMsg) throws Exception {
        Map<String, Object> resMap = new HashMap<>(16);
        Document document = DocumentHelper.parseText(resMsg);

        Element resultInfo = document.getRootElement().element("Result").element("Info");
        String executeStatus = resultInfo.attributeValue("EXECUTE_STATUS");
        String executeMessage = resultInfo.attributeValue("EXECUTE_MESSAGE");
        List<Map<String, Object>> dataList = new ArrayList<>();

        if (Dialect.getSuccessfulState().equals(executeStatus)) {
            // 获取各个参数的值（出参的树状结构：父==》子）
            // 取得数据为数组形式
            List<Element> dataRowList = document.getRootElement().element("ReturnData").element("Data").elements();

            if (dataRowList == null || dataRowList.size() == 0) {
                resMap.put("code", "1403");
                resMap.put("message", "调用成功，但是获取的数据为 0 件！");
            } else {
                for (Element dataRow : dataRowList) {
                    Map<String, Object> subMap = new HashMap<>(16);
                    GetPatAllInHosInnerMessage innerMessage = new GetPatAllInHosInnerMessage(dataRow);

                    // 住院号
                    subMap.put("inpNo", innerMessage.getInpNo());
                    // 患者ID
                    subMap.put("patientId", innerMessage.getPatientId());
                    // 患者姓名
                    subMap.put("patientName", innerMessage.getPatientName());
                    // 性别
                    subMap.put("sex", innerMessage.getSex());
                    // 出生日期
                    subMap.put("birthDate", innerMessage.getBirthDate());
                    // 身份证号
                    subMap.put("idNo", innerMessage.getIdNo());
                    // 电话号码
                    subMap.put("phoneNumber", innerMessage.getPhoneNumber());
                    // 住院次数
                    subMap.put("visitId", innerMessage.getVisitId());
                    // 入院时间
                    subMap.put("admissionDateTime", innerMessage.getAdmissionDateTime());
                    // 入院方式
                    subMap.put("patientClassName", innerMessage.getPatientClassName());
                    // 入院科室编码
                    subMap.put("deptAdmissionTo", innerMessage.getDeptAdmissionTo());
                    // 入院科室名称
                    subMap.put("deptNameTo", innerMessage.getDeptNameTo());
                    // 入院病情
                    subMap.put("patConditionName", innerMessage.getPatConditionName());
                    // 入院诊断
                    subMap.put("diagnosisDesc", innerMessage.getDiagnosisDesc());
                    // 出院时间
                    subMap.put("dischargeDateTime", innerMessage.getDischargeDateTime());
                    // 出院科室编码
                    subMap.put("deptDischargeFrom", innerMessage.getDeptDischargeFrom());
                    // 出院科室名称
                    subMap.put("deptNameFrom", innerMessage.getDeptNameFrom());
                    // 接诊时间
                    subMap.put("consultingDateTime", innerMessage.getConsultingDateTime());
                    // 接诊医生编码
                    subMap.put("consultingDoctorCode", innerMessage.getConsultingDoctorCode());
                    // 接诊医生
                    subMap.put("consultingDoctor", innerMessage.getConsultingDoctor());
                    // 经治医生编码
                    subMap.put("doctorCodeInCharge", innerMessage.getDoctorCodeInCharge());
                    // 经治医生
                    subMap.put("doctorInCharge", innerMessage.getDoctorInCharge());
                    // 过敏药物
                    subMap.put("alergyDrugs", innerMessage.getAlergyDrugs());
                    // 在院病区编码
                    subMap.put("wardCode", innerMessage.getWardCode());
                    // 在院病区名称
                    subMap.put("wardName", innerMessage.getWardName());
                    // 在院床位号
                    subMap.put("bedNo", innerMessage.getBedNo());
                    // 患者工作电话
                    subMap.put("phoneNumberBusiness", innerMessage.getPhoneNumberBusiness());
                    // 联系人电话
                    subMap.put("nextOfKinPhone", innerMessage.getNextOfKinPhone());
                    // 经治医院
                    subMap.put("transferInHospital", innerMessage.getTransferInHospital());
                    // 门诊诊断日期
                    subMap.put("clinicDiagnosisDate", innerMessage.getClinicDiagnosisDate());
                    // 门诊诊断
                    subMap.put("clinicDiagnosisDesc", innerMessage.getClinicDiagnosisDesc());
                    // 住院患者电话"
                    subMap.put("currentPhone", innerMessage.getCurrentPhone());


                    // 追加一行数据到List
                    dataList.add(subMap);
                }

                // 返回所有行数据
                resMap.put("dataList", dataList);

                // 返回Code
                resMap.put("code", executeStatus);
                // 返回信息
                resMap.put("message", "成功！");
            }
        } else {
            resMap.put("code", executeStatus);
            resMap.put("message", executeMessage);
        }
        return resMap;
    }

    public class GetPatAllInHosInnerMessage implements InnerMessage{
        /**
         * 住院号
         */
        private String inpNo;
        /**
         * 患者ID
         */
        private String patientId;
        /**
         * 患者姓名
         */
        private String patientName;
        /**
         * 性别
         */
        private String sex;
        /**
         * 出生日期
         */
        private String birthDate;
        /**
         * 身份证号
         */
        private String idNo;
        /**
         * 电话号码
         */
        private String phoneNumber;
        /**
         * 住院次数
         */
        private String visitId;
        /**
         * 入院时间
         */
        private String admissionDateTime;
        /**
         * 入院方式
         */
        private String patientClassName;
        /**
         * 入院科室编码
         */
        private String deptAdmissionTo;
        /**
         * 入院科室名称
         */
        private String deptNameTo;
        /**
         * 入院病情
         */
        private String patConditionName;
        /**
         * 入院诊断
         */
        private String diagnosisDesc;
        /**
         * 出院时间
         */
        private String dischargeDateTime;
        /**
         * 出院科室编码
         */
        private String deptDischargeFrom;
        /**
         * 出院科室名称
         */
        private String deptNameFrom;
        /**
         * 接诊时间
         */
        private String consultingDateTime;
        /**
         * 接诊医生编码
         */
        private String consultingDoctorCode;
        /**
         * 接诊医生
         */
        private String consultingDoctor;
        /**
         * 经治医生编码
         */
        private String doctorCodeInCharge;
        /**
         * 经治医生
         */
        private String doctorInCharge;
        /**
         * 过敏药物
         */
        private String alergyDrugs;
        /**
         * 在院病区编码
         */
        private String wardCode;
        /**
         * 在院病区名称
         */
        private String wardName;
        /**
         * 在院床位号
         */
        private String bedNo;
        /**
         * 患者工作电话
         */
        private String phoneNumberBusiness;
        /**
         * 联系人电话
         */
        private String nextOfKinPhone;
        /**
         * 经治医院
         */
        private String transferInHospital;
        /**
         * 门诊诊断日期
         */
        private String clinicDiagnosisDate;
        /**
         * 门诊诊断
         */
        private String clinicDiagnosisDesc;
        /**
         * 住院患者电话"
         */
        private String currentPhone;





        public GetPatAllInHosInnerMessage(Element element) {
            // 住院号
            this.inpNo = element.attributeValue("INP_NO");
            // 患者ID
            this.patientId = element.attributeValue("PATIENT_ID");
            // 患者姓名
            this.patientName = element.attributeValue("PATIENT_NAME");
            // 性别
            this.sex = element.attributeValue("SEX");
            // 出生日期
            this.birthDate = element.attributeValue("BIRTH_DATE");
            // 身份证号
            this.idNo = element.attributeValue("ID_NO");
            // 电话号码
            this.phoneNumber = element.attributeValue("PHONE_NUMBER");
            // 住院次数
            this.visitId = element.attributeValue("VISIT_ID");
            // 入院时间
            this.admissionDateTime = element.attributeValue("ADMISSION_DATE_TIME");
            // 入院方式
            this.patientClassName = element.attributeValue("PATIENT_CLASS_NAME");
            // 入院科室编码
            this.deptAdmissionTo = element.attributeValue("DEPT_ADMISSION_TO");
            // 入院科室名称
            this.deptNameTo = element.attributeValue("DEPT_NAME_TO");
            // 入院病情
            this.patConditionName = element.attributeValue("PAT_CONDITION_NAME");
            // 入院诊断
            this.diagnosisDesc = element.attributeValue("DIAGNOSIS_DESC");
            // 出院时间
            this.dischargeDateTime = element.attributeValue("DISCHARGE_DATE_TIME");
            // 出院科室编码
            this.deptDischargeFrom = element.attributeValue("DEPT_DISCHARGE_FROM");
            // 出院科室名称
            this.deptNameFrom = element.attributeValue("DEPT_NAME_FROM");
            // 接诊时间
            this.consultingDateTime = element.attributeValue("CONSULTING_DATE_TIME");
            // 接诊医生编码
            this.consultingDoctorCode = element.attributeValue("CONSULTING_DOCTOR_CODE");
            // 接诊医生
            this.consultingDoctor = element.attributeValue("CONSULTING_DOCTOR");
            // 经治医生编码
            this.doctorCodeInCharge = element.attributeValue("DOCTOR_CODE_IN_CHARGE");
            // 经治医生
            this.doctorInCharge = element.attributeValue("DOCTOR_IN_CHARGE");
            // 过敏药物
            this.alergyDrugs = element.attributeValue("ALERGY_DRUGS");
            // 在院病区编码
            this.wardCode = element.attributeValue("WARD_CODE");
            // 在院病区名称
            this.wardName = element.attributeValue("WARD_NAME");
            // 在院床位号
            this.bedNo = element.attributeValue("BED_NO");
            // 患者工作电话
            this.phoneNumberBusiness = element.attributeValue("PHONE_NUMBER_BUSINESS");
            // 联系人电话
            this.nextOfKinPhone = element.attributeValue("NEXT_OF_KIN_PHONE");
            // 经治医院
            this.transferInHospital = element.attributeValue("TRANSFER_IN_HOSPITAL");
            // 门诊诊断日期
            this.clinicDiagnosisDate = element.attributeValue("CLINIC_DIAGNOSIS_DATE");
            // 门诊诊断
            this.clinicDiagnosisDesc = element.attributeValue("CLINIC_DIAGNOSIS_DESC");
            // 住院患者电话
            this.currentPhone = element.attributeValue("CURRENT_PHONE");


        }

        /**
         * 住院号
         */
        public String getInpNo() {
            return inpNo;
        }
        /**
         * 患者ID
         */
        public String getPatientId() {
            return patientId;
        }
        /**
         * 患者姓名
         */
        public String getPatientName() {
            return patientName;
        }
        /**
         * 性别
         */
        public String getSex() {
            return sex;
        }
        /**
         * 出生日期
         */
        public String getBirthDate() {
            return birthDate;
        }
        /**
         * 身份证号
         */
        public String getIdNo() {
            return idNo;
        }
        /**
         * 电话号码
         */
        public String getPhoneNumber() {
            return phoneNumber;
        }
        /**
         * 住院次数
         */
        public String getVisitId() {
            return visitId;
        }
        /**
         * 入院时间
         */
        public String getAdmissionDateTime() {
            return admissionDateTime;
        }
        /**
         * 入院方式
         */
        public String getPatientClassName() {
            return patientClassName;
        }
        /**
         * 入院科室编码
         */
        public String getDeptAdmissionTo() {
            return deptAdmissionTo;
        }
        /**
         * 入院科室名称
         */
        public String getDeptNameTo() {
            return deptNameTo;
        }
        /**
         * 入院病情
         */
        public String getPatConditionName() {
            return patConditionName;
        }
        /**
         * 入院诊断
         */
        public String getDiagnosisDesc() {
            return diagnosisDesc;
        }
        /**
         * 出院时间
         */
        public String getDischargeDateTime() {
            return dischargeDateTime;
        }
        /**
         * 出院科室编码
         */
        public String getDeptDischargeFrom() {
            return deptDischargeFrom;
        }
        /**
         * 出院科室名称
         */
        public String getDeptNameFrom() {
            return deptNameFrom;
        }
        /**
         * 接诊时间
         */
        public String getConsultingDateTime() {
            return consultingDateTime;
        }
        /**
         * 接诊医生编码
         */
        public String getConsultingDoctorCode() {
            return consultingDoctorCode;
        }
        /**
         * 接诊医生
         */
        public String getConsultingDoctor() {
            return consultingDoctor;
        }
        /**
         * 经治医生编码
         */
        public String getDoctorCodeInCharge() {
            return doctorCodeInCharge;
        }
        /**
         * 经治医生
         */
        public String getDoctorInCharge() {
            return doctorInCharge;
        }
        /**
         * 过敏药物
         */
        public String getAlergyDrugs() {
            return alergyDrugs;
        }
        /**
         * 在院病区编码
         */
        public String getWardCode() {
            return wardCode;
        }
        /**
         * 在院病区名称
         */
        public String getWardName() {
            return wardName;
        }
        /**
         * 在院床位号
         */
        public String getBedNo() {
            return bedNo;
        }
        /**
         * 患者工作电话
         */
        public String getPhoneNumberBusiness() {
            return phoneNumberBusiness;
        }
        /**
         * 联系人电话
         */
        public String getNextOfKinPhone() {
            return nextOfKinPhone;
        }
        /**
         * 经治医院
         */
        public String getTransferInHospital() {
            return transferInHospital;
        }
        /**
         * 门诊诊断日期
         */
        public String getClinicDiagnosisDate() {
            return clinicDiagnosisDate;
        }
        /**
         * 门诊诊断
         */
        public String getClinicDiagnosisDesc() {
            return clinicDiagnosisDesc;
        }
        /**
         * 住院患者电话
         */
        public String getCurrentPhone() {
            return currentPhone;
        }

    }
}
